#include "../sylar/sylar.h"
#include <iostream>
#include <chrono>

int main() {
    // 初始化工具类和日志系统
    sylar::InitUtil();
    SYLAR_LOG_INIT();

    // 测试1：单例日志管理器功能验证
    auto loggerMgr = sylar::LoggerManager::GetInstance();
    if (!loggerMgr) {
        std::cerr << "LoggerManager单例初始化失败!" << std::endl;
        return 1;
    }
    if (!loggerMgr->getDebugLogger() || !loggerMgr->getInfoLogger() ||
        !loggerMgr->getWarnLogger() || !loggerMgr->getErrorLogger() || !loggerMgr->getFatalLogger()) {
        std::cerr << "部分日志器初始化失败!" << std::endl;
        return 1;
    }
    SYLAR_LOG_I("单例日志管理器初始化验证成功");

    // 测试2：自定义日志器及多Appender配置
    sylar::Logger::ptr custom_logger = std::make_shared<sylar::Logger>("custom");
    
    // 添加标准输出Appender
    sylar::StdoutLogAppender::ptr stdout_appender = std::make_shared<sylar::StdoutLogAppender>();
    stdout_appender->setFormatter(std::make_shared<sylar::LogFormatter>(
        "%d{%Y-%m-%d %H:%M:%S} [ %p ] %f:%l - %m %n"
    ));
    custom_logger->addAppender(stdout_appender);
    
    // 添加文件Appender
    sylar::FileLogAppender::ptr file_appender = std::make_shared<sylar::FileLogAppender>("test_all.log");
    file_appender->setFormatter(std::make_shared<sylar::LogFormatter>(
        "%d{%Y-%m-%d %H:%M:%S} [ %p ] %f:%l - %m %n"
    ));
    if (!file_appender->reopen()) {
        std::cerr << "打开日志文件失败!" << std::endl;
        return 1;
    }
    custom_logger->addAppender(file_appender);
    SYLAR_LOG_FMT_INFO(custom_logger, "自定义日志器初始化完成");

    // 测试3：手动构造LogEvent并输出
    uint64_t now = sylar::GetTime();
    sylar::LogEvent::ptr event = std::make_shared<sylar::LogEvent>(
        custom_logger,
        sylar::LogLevel::DEBUG,
        __FILE__,
        __LINE__,
        sylar::GetElapse(),
        sylar::GetThreadId(),
        sylar::GetFiberId(),
        now
    );
    event->setContent("手动构造的原始日志事件");
    custom_logger->debug(event);
    custom_logger->info(event);
    custom_logger->warn(event);
    custom_logger->error(event);
    custom_logger->fatal(event);

    // 测试4：LogEvent格式化功能
    event->format("格式化测试：%d + %d = %d", 100, 200, 300);
    custom_logger->info(event);

    // 测试5：流式日志宏
    SYLAR_LOG_DEBUG(custom_logger) << "流式调试日志，线程ID：" << sylar::GetThreadId();
    SYLAR_LOG_INFO(custom_logger) << "流式信息日志，运行时间：" << sylar::GetElapse() << "ms";
    SYLAR_LOG_WARN(custom_logger) << "流式警告日志：内存使用率过高";
    SYLAR_LOG_ERROR(custom_logger) << "流式错误日志：文件读取失败";
    SYLAR_LOG_FATAL(custom_logger) << "流式致命日志：数据库连接断开";

    // 测试6：格式化日志宏
    SYLAR_LOG_FMT_DEBUG(custom_logger, "格式化调试：%s=%d", "value", 12345);
    SYLAR_LOG_FMT_INFO(custom_logger, "用户%s登录成功，ID：%d", "admin", 10086);
    SYLAR_LOG_FMT_WARN(custom_logger, "磁盘空间不足：剩余%d%%", 10);
    SYLAR_LOG_FMT_ERROR(custom_logger, "文件%s打开失败，错误码：%d", "config.ini", 2);
    SYLAR_LOG_FMT_FATAL(custom_logger, "系统将于%d秒后重启", 60);

    // 测试7：单例日志器直接使用
    SYLAR_LOG_D("单例调试日志：配置加载完成");
    SYLAR_LOG_I("单例信息日志：服务启动成功");
    SYLAR_LOG_W_STREAM() << "单例流式警告：网络延迟过高";
    SYLAR_LOG_E_STREAM() << "单例流式错误：连接超时";

    return 0;
}
